<?php
/** 
 * @author felipe
 * 
 * 
 */
class App_Model_CompraMapper extends Voitech_Mapper{
	
    
        public function __construct(App_Model_Compra $obModel){
            $this->obModel = $obModel;
        }     
	
	/**
	 * Metodo para buscar uma compra
	 * @param int $coCompra
	 * @return App_Model_Compra
	 */
	public function buscarPorId() {
            $rowCompra = App_Model_Db_Compra::build()->buscarCompra( $this->obModel->getCoCompra() );
            if( empty( $rowCompra ) )
            {
                    return $rowCompra;
            }	
            $this->carregar($rowCompra);
            return $this;
        }
        
        public function carregar(stdClass $rowCompra){
            //Zend_Debug::dump($rowCompra);exit;
            $this->obModel->setCoCompra($rowCompra->co_compra);
            $this->obModel->setNuNota($rowCompra->nu_nota);
            $this->obModel->setDtCompra($rowCompra->dt_cadastro);

            $obTipoCompra = new App_Model_TipoCompra();
            $obTipoCompra->setCoTipoCompra($rowCompra->co_tipo_compra);
            $obTipoCompra->setNoTipoCompra($rowCompra->no_tipo_compra);
            

            $this->obModel->setObTipoCompra($obTipoCompra);
        
            $arrItemCompra = App_Model_Db_ItemCompra::build()->listarTodos(new Voitech_TO(array('co_compra'=>$rowCompra->co_compra,'st_ativo'=>'S')));

            foreach($arrItemCompra as $rowItem) {
                $obProduto = new App_Model_Produto();
                $obProduto->setCoProduto($rowItem->co_produto);
                $obProduto->setNoProduto($rowItem->no_produto);

                $obCategoria = new App_Model_Categoria();
                $obCategoria->setCoCategoria($rowItem->co_categoria);
                $obCategoria->setNoCategoria($rowItem->no_categoria);
                $obProduto->setObCategoria($obCategoria);
                
                $obTipoProduto = new App_Model_TipoProduto();
                $obTipoProduto->setCoTipoProduto($rowItem->co_tipo_produto);
                $obTipoProduto->setNoTipoProduto($rowItem->no_tipo_produto);
                $obProduto->setObTipoProduto($obTipoProduto);

                $obItemCompra = new App_Model_ItemCompra();
                $obItemCompra->setObProduto($obProduto);
                $obItemCompra->setDsLote($rowItem->ds_lote);
                $obItemCompra->setNuQuantidadeProduto($rowItem->nu_quantidade_produto);
                $obItemCompra->setNuQuantidadeUnitaria($rowItem->nu_quantidade_unitaria);
                $obItemCompra->setVlUnitario($rowItem->vl_unitario);

                $this->obModel->adicionarItemCompra($obItemCompra);
            }

            $obFornecedor = new App_Model_Fornecedor();
            $obFornecedor->setCoFornecedor($rowCompra->co_fornecedor);
            $obFornecedor->setNoFornecedor($rowCompra->no_fornecedor);
            $obFornecedor->setNuCnpj($rowCompra->nu_cnpj);
            $obFornecedor->setNuInscricao($rowCompra->nu_inscricao);
            $obFornecedor->setDsEndereco($rowCompra->ds_endereco);
            $obFornecedor->setNuTelefone($rowCompra->nu_telefone);

            $obRepresentante = new App_Model_Representante();
            $obRepresentante->setCoPessoa($rowCompra->co_representante);
            $obRepresentante->setNoPessoa($rowCompra->no_representante);
            $obRepresentante->setNuCpf($rowCompra->nu_cpf_representante);

            $obFornecedor->setObRepresentante( $obRepresentante );

            $obUsuario = new App_Model_Usuario();
            $obUsuario->setCoPessoa($rowCompra->co_usuario);
            $obUsuario->setNoPessoa($rowCompra->no_usuario);
            $obUsuario->setNuCpf($rowCompra->nu_cpf_usuario);

            $this->obModel->fecharCompra($obFornecedor, $obUsuario);
            
            return $this;
	}
	
	/**
	 * Metodo que insere/altera uma compra
	 * 
	 * @param  App_Model_Compra $this->obModel
	 * @return void
	 */
	public function cadastrar() {
            $arrCompra = $this->retornarArrayPopulado();
            $rowCompra = App_Model_Db_Compra::build()->fetchRow('nu_nota like \'%'.$arrCompra['nu_nota'].'%\' and co_fornecedor = '.$this->obModel->getObFornecedor()->getCoFornecedor());           
            if( !empty($rowCompra)){
                throw new Voitech_Exception('Nota fiscal ja existente no sistema para esse fornecedor');
            }
            $this->obModel->setCoCompra(App_Model_Db_Compra::build()->insert($arrCompra));
            $arrItemCompra = $this->obModel->getArrItemCompra();
            foreach($arrItemCompra as $obItemCompra) {
                $obItemCompraMapper = new App_Model_ItemCompraMapper($obItemCompra,$this->obModel->getCoCompra());
                $obItemCompraMapper->cadastrar();
                
                //$obArmazenagemCompra = new App_Model_ArmazenagemMapper();
            }
            return $this;
	}
        
        public function alterar(){
            App_Model_Db_Compra::build()->update($this->retornarArrayPopulado()
					       ,array('co_compra = ?' => $this->obModel->getCoCompra()));
            // busca o itens ativos para esta compra
            $obItemCompraRepository = new App_Model_ItemCompraRepository();            
            $arrObItemCompraExistente = $obItemCompraRepository->listarTodosAtivosPorCompra($this->getCoCompra());
            $arrProdutoExistente = array();
            foreach($arrObItemCompraExistente as $obItemCompra){
                $arrProdutoExistente[$obItemCompra->getObProduto()->getCoProduto()] = $obItemCompra;
            }
            
            $arrItemCompra = $this->obModel->getArrItemCompra();            
            foreach($arrItemCompra as $obItemCompra) {                
                //verifica se o item que veio do formulario existe na lista atual
                if( in_array($obItemCompra->getObProduto()->getCoProduto(),$arrProdutoExistente))
                {
                    $obItemCompraMapper = new App_Model_ItemCompraMapper($obItemCompra,$this->obModel->getCoCompra());
                    $obItemCompraMapper->alterar();
                    //remove o item que ja foi alterado
                    unset($arrProdutoExistente[$obItemCompra->getObProduto()->getCoProduto()]);
                }
            }	
            
            //verifica se algum item foi excluido da lista de compra
            if( !empty($arrProdutoExistente) ){
                //desativa os itens que não vieram do formulario
                foreach($arrProdutoExistente as $obItemCompra){
                    $obItemCompraMapper = new App_Model_ItemCompraMapper($obItemCompra,$this->obModel->getCoCompra());
                    $obItemCompraMapper->desativar();
                }
            }            
        }   
	
	/**
	 * Metodo que exclui uma compra
	 * @param App_Model_Compra $this->obModel
	 */
	public function ativar() {
            App_Model_Db_Compra::build()->udpate(array('st_ativo'=>'N')
                                               ,array('co_compra = ?'=> $this->obModel->getCoCompra()));
	}	
        
        public function desativar(){
            App_Model_Db_Compra::build()->udpate(array('st_ativo'=>'N')
                                               ,array('co_compra = ?'=> $this->obModel->getCoCompra()));
        }
        
        public function retornarArrayPopulado() {
            $arrCompra = array('co_tipo_compra'=>$this->obModel->getObTipoCompra()->getCoTipoCompra()
                              ,'nu_nota'=>$this->obModel->getNuNota()
                              ,'co_fornecedor'=>$this->obModel->getObFornecedor()->getCoFornecedor()
                              ,'co_pessoa'=>$this->obModel->getObUsuario()->getCoPessoa());
            return $arrCompra;
        }
}